﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PraxisRent.Entities;
using PraxisRent.BL;
using Microsoft.Practices.Unity;

namespace PraxisRent.UI
{
    public partial class FrmMttoDevolucion : Form
    {
        [Dependency]
        public IDevolucionBL devolucionBL { get; set; }

        [Dependency]
        public IDetalleAlquilerBL detAlqBL { get; set; }

        [Dependency]
        public IAlquilerBL alquilerBL { get; set; }

        [Dependency]
        public IClienteJuridicoBL cliJuriBL { get; set; }

        [Dependency]
        public IClienteNaturalBL cliNatBL { get; set; }

        [Dependency]
        public IEquipoBL equipoBL { get; set; }

        public FrmMttoDevolucion()
        {
            InitializeComponent();
            this.BuilUp();
        }

        bool isNew;

        List<DETALLE_ALQUILER> _listEquipoDeAlquilerPorAsignar;

        public void NuevaDevolucion()
        {
            isNew = true;
            dEVOLUCIONBindingSource.AddNew();
        }

        public DEVOLUCION _devolucion { get; set; }

        public void EditarDevolucion()
        {
            dEVOLUCIONBindingSource.DataSource = _devolucion;
        }

        private void FrmMttoDevolucion_Load(object sender, EventArgs e)
        {
            dEVOLUCIONBindingSource.AddNew();
            timer1.Start();
            _listEquipoDeAlquilerPorAsignar = new List<DETALLE_ALQUILER>();
        }

        public void VerificarAlquiler()
        {
            if (Convert.ToInt32(txtCodAlquiler.Text) > 0)
            {
                var alquiler = alquilerBL.GetAllFromAlquilerByCodigo(Convert.ToInt32(txtCodAlquiler.Text));
                var devolucion = dEVOLUCIONBindingSource.Current as DEVOLUCION;

                if (alquiler != null)
                {
                    //obtenemos al cliente JURIDICO
                    var clienteJuri = (from c in cliJuriBL.GetAllFromClienteJuridico()
                                       where c.ClienteJuridicoId.Equals(alquiler.CLIENTE.Codigo)
                                       select c).SingleOrDefault();

                    //obtenemos al cliente NATURAL
                    var clienteNat = (from c in cliNatBL.GetAllFromClienteNatural()
                                      where c.ClienteNaturalId.Equals(alquiler.CLIENTE.Codigo)
                                      select c).SingleOrDefault();

                    //obtenemos los EQUIPOS del ALQUILER que NO han sido DEVUELTOS
                    var detAlquiler = (from c in detAlqBL.GetAllFromDetalleAlquilerByAlquilerId(alquiler.Codigo)
                                       where c.Devuelto==false
                                       select c).ToList();

                    //asignamos a los clinetes NAT y JURI al cliente obtenido del alquiler y los EQUIPOS del alquiler
                    alquiler.CLIENTE.CLIENTE_JURIDICO = clienteJuri;
                    alquiler.CLIENTE.CLIENTE_NATURAL = clienteNat;
                    //alquiler.DETALLE_ALQUILER = detAlquiler;

                    devolucion.CodigoAlquiler = alquiler.Codigo;
                    nombreTextBox1.Text = alquiler.OBRA.Nombre;
                    //dETALLE_ALQUILERBindingSource.DataSource = alquiler.DETALLE_ALQUILER;

                    if (alquiler.CLIENTE.CLIENTE_JURIDICO != null)
                    {
                        txtNomRazSocial.Text = alquiler.CLIENTE.CLIENTE_JURIDICO.RazonSocial;
                        txtRucDni.Text = alquiler.CLIENTE.CLIENTE_JURIDICO.Ruc;
                    }
                    if (alquiler.CLIENTE.CLIENTE_NATURAL != null)
                    {
                        txtNomRazSocial.Text = alquiler.CLIENTE.CLIENTE_NATURAL.NombreCompleto;
                        txtRucDni.Text = alquiler.CLIENTE.CLIENTE_NATURAL.Dni;
                    }
                    dEVOLUCIONBindingSource.ResetBindings(true);

                    if (detAlquiler.Count != 0)
                    {
                        dETALLE_ALQUILERBindingSource.DataSource = detAlquiler;
                        dETALLE_ALQUILERBindingSource.ResetBindings(true);
                    }
                    else
                    {
                        MessageBox.Show("Todos los Equipos de este Alquiler han sido DEVUELTOS", "Mensaje");
                        this.Close();
                    }
                }
                else
                {
                    MessageBox.Show("Alquiler no Existente", "Mensaje");
                }
            }
            else
            {
                MessageBox.Show("Ingrese un código de Alquiler", "Mensaje");
            }
        }

        private void txtCodAlquiler_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                VerificarAlquiler();
            }
        }

        private void txtCodAlquiler_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                VerificarAlquiler();
            }
        }

        private void txtCodAlquiler_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            lblFecha.Text = DateTime.Now.ToLongDateString();
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            var detAlquiler = dETALLE_ALQUILERBindingSource.Current as DETALLE_ALQUILER;
            var currentDevolucion = dEVOLUCIONBindingSource.Current as DEVOLUCION;

            if (detAlquiler != null)
            {
                var detalle = new DETALLE_DEVOLUCION
                {
                    CodigoDevolucion = currentDevolucion.Codigo,
                    CodigoEquipo = detAlquiler.CodigoEquipo,
                    EQUIPO = detAlquiler.EQUIPO,
                    DEVOLUCION = currentDevolucion
                };

                var existe = currentDevolucion.DETALLE_DEVOLUCION.Where(d => d.EQUIPO.Codigo.Equals(detAlquiler.CodigoEquipo)).SingleOrDefault();

                if (existe == null)
                {
                    currentDevolucion.DETALLE_DEVOLUCION.Add(detalle);
                }
                else
                {
                    MessageBox.Show(detalle.EQUIPO.Nombre + " ya se encuentra agregado", "Mensaje", MessageBoxButtons.OK);
                }

                _listEquipoDeAlquilerPorAsignar.Add(detAlquiler);
                dEVOLUCIONBindingSource.ResetBindings(true);
                dETALLE_DEVOLUCIONBindingSource.ResetBindings(true);
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            var detalleDevolucion = dETALLE_DEVOLUCIONBindingSource.Current as DETALLE_DEVOLUCION;
            var devolucion = dEVOLUCIONBindingSource.Current as DEVOLUCION;

            if (detalleDevolucion != null)
            {
                var rpt = MessageBox.Show(this, string.Format("¿Desea Quitar el Equipo: {0} ?", detalleDevolucion.EQUIPO.Nombre), "Quitar Equipo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    dETALLE_DEVOLUCIONBindingSource.RemoveCurrent();
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un equipo para poder Quitar");
            }
            dEVOLUCIONBindingSource.ResetBindings(true);
            dETALLE_DEVOLUCIONBindingSource.ResetBindings(true);
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            var devolucion = dEVOLUCIONBindingSource.Current as DEVOLUCION;

            var msg = "ERROR";

            if (devolucion != null)
            {
                if (isNew == true)
                {
                    try
                    {
                        devolucion.Observaciones = observacionesRichTextBox.Text.ToUpper();
                        devolucion.FechaDevolucion = Convert.ToDateTime(DateTime.Now.ToLongDateString());
                        var hora = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
                        devolucion.HoraDevolucion = hora;
                        devolucionBL.AddDevolucion(devolucion);

                        //enviar lista de ekipos devueltos
                        detAlqBL.updateDetalleAlquilerByDevuelto(devolucion);

                        //cambiamos el estado de los equipos devueltos
                        foreach (var item in devolucion.DETALLE_DEVOLUCION)
                        {
                            item.EQUIPO.Disponible = true;
                            equipoBL.UpdateEquipo(item.EQUIPO);
                        }

                        var detAlquiler = (from c in detAlqBL.GetAllFromDetalleAlquilerByAlquilerId(devolucion.CodigoAlquiler)
                                           where c.Devuelto == false
                                           select c).ToList();
                        var alqui = alquilerBL.GetAllFromAlquilerByCodigo(devolucion.CodigoAlquiler);
                        devolucion.ALQUILER = alqui;

                        if (detAlquiler.Count == 0)
                        {
                            devolucion.ALQUILER.Devuelto = true;
                            alquilerBL.UpdateAlquiler(devolucion.ALQUILER);
                        }

                        MessageBox.Show("Registro Correcto ", "Registro",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }
    }
}
